package com.bot.dev.module.job.task;

import com.bot.common.chainbo.TradingResultsInfo;
import com.bot.dev.api.DevBlockChainApi;
import com.bot.nft.core.enums.chain.ChainLogEnum;
import com.bot.nft.core.enums.dc.NftCertEnum;
import com.bot.nft.module.chain.domain.ChainOptLogInfo;
import com.bot.nft.module.chain.service.ChainOptLogServer;
import com.bot.nft.module.dc.domain.DcNftCert;
import com.bot.nft.module.dc.domain.bo.DcNftCertBo;
import com.bot.nft.module.dc.domain.bo.DcNftInfoBo;
import com.bot.nft.module.dc.mapper.DcNftCertMapper;
import com.bot.nft.module.dc.mapper.DcNftInfoMapper;
import com.bot.nft.module.dc.service.IDcNftCertService;
import com.bot.nft.module.dc.service.IDcNftInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import com.bot.common.timer.CommonTimerTaskRunner;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 定时器的一个示例
 *
 * @author botian
 * @date 2024/2/1
 **/
@Slf4j
@Component
public class ChainTimerTaskRunner implements CommonTimerTaskRunner {

    private int n = 1;

    //上链操作日志接口
    @Resource
    private ChainOptLogServer chainOptLogServer;

    @Resource
    private DevBlockChainApi devBlockChainApi;

    //藏品证书接口
    @Resource
    private IDcNftCertService iDcNftCertService;

    //藏品接口
    @Resource
    private IDcNftInfoService iDcNftInfoService;


    @Override
    public void action() {
        log.info("上链补偿定时器，正在在被执行第" + n + "次");
        n = n + 1;
        //1.查询操作日志
        List<ChainOptLogInfo> chainOptLogInfos = chainOptLogServer.queryCOL(null);
        for (ChainOptLogInfo chainOptLogInfo : chainOptLogInfos) {
            //2.查询上链结果
            String operationId = chainOptLogInfo.getOperationId();
            TradingResultsInfo tradingResultsInfo = devBlockChainApi.queryTranRecords(operationId);
            if (ObjectUtils.isEmpty(tradingResultsInfo)) {
                continue;
            }
            Integer status = tradingResultsInfo.getData().getStatus();
            //3.处理

            Integer chainOptType = chainOptLogInfo.getChainOptType();

            Integer dcOptType = chainOptLogInfo.getDcOptType();

            String objId = chainOptLogInfo.getObjId();

            String userId = chainOptLogInfo.getUserId();

            //创建NFT类别
            if (chainOptType.equals(ChainLogEnum.CHAIN_CREATE_NFT_CLASS.getValue())) {
                String classId = tradingResultsInfo.getData().getNft().getClassId();
                Boolean flag = iDcNftInfoService.updataNftContract(objId, classId);
            }
            //发行NFT
            if (chainOptType.equals(ChainLogEnum.CHAIN_PUBLISH_NFT.getValue())) {
                if (status.equals(ChainLogEnum.SUCCEEDSTATUS.getValue())) {
                    String certChainId = tradingResultsInfo.getData().getNft().getId();
                    //保存藏品证书链上标识，藏品证书持有人
                    DcNftCertBo dcNftCert = new DcNftCertBo();
                    dcNftCert.setId(objId);
                    dcNftCert.setChainAddr(certChainId);
                    dcNftCert.setMbId(userId);
                    Boolean flag = iDcNftCertService.updateCert(dcNftCert);
                }
            }
            //转让NFT
            if (chainOptType.equals(ChainLogEnum.CHAIN_MAKE_OVER_NFT.getValue())) {
                if (status.equals(ChainLogEnum.SUCCEEDSTATUS.getValue())) {
                    //保存藏品证书链上标识，藏品证书持有人
                    DcNftCertBo dcNftCert = new DcNftCertBo();
                    dcNftCert.setId(objId);
                    dcNftCert.setMbId(userId);
                    Boolean flag = iDcNftCertService.updateCert(dcNftCert);
                }
            }
            //销毁NFT
            if (chainOptType.equals(ChainLogEnum.CHAIN_MAKE_OVER_NFT.getValue())) {
                if (status.equals(ChainLogEnum.SUCCEEDSTATUS.getValue())) {
                    //保存藏品证书链上标识，藏品证书持有人
                    DcNftCertBo dcNftCert = new DcNftCertBo();
                    dcNftCert.setId(objId);
                    dcNftCert.setChainAddr("");
                    dcNftCert.setStatus(NftCertEnum.DESTROYED.getValue());
                    Boolean flag = iDcNftCertService.updateCert(dcNftCert);
                }
            }

            //修改操作日志
            chainOptLogInfo.setStatus(status);
            chainOptLogServer.updateCPLog(chainOptLogInfo);
        }
    }
}
